// 数据库性能测试脚本
import { dbService } from '../services/dbService.js'

// 测试集合名称
const PERFORMANCE_TEST_COLLECTION = 'performanceTestCollection'

// 性能测试函数
export async function runPerformanceTests() {
  console.log('=== 开始数据库性能测试 ===')
  
  // 清空测试集合
  await dbService.clearCollection(PERFORMANCE_TEST_COLLECTION)
  console.log('清空测试集合完成')
  
  // 1. 缓存性能测试
  console.log('\n1. 缓存性能测试...')
  await testCachePerformance()
  
  // 2. 批量操作性能测试
  console.log('\n2. 批量操作性能测试...')
  await testBatchPerformance()
  
  // 3. 查询性能测试
  console.log('\n3. 查询性能测试...')
  await testQueryPerformance()
  
  // 4. 获取性能统计
  console.log('\n4. 数据库性能统计:')
  const stats = await dbService.getPerformanceStats()
  console.log('   缓存命中率:', (stats.cacheHitRate * 100).toFixed(2) + '%')
  console.log('   缓存项数量:', stats.cacheItems)
  console.log('   批处理操作:', stats.batchOperations)
  console.log('   延迟写入数:', stats.delayedWrites)
  console.log('   压缩节省空间:', (stats.compressionSaved * 100).toFixed(2) + '%')
  
  console.log('\n=== 性能测试完成 ===')
  return stats
}

// 测试缓存性能
async function testCachePerformance() {
  // 添加测试文档
  const testDoc = {
    title: '缓存测试文档',
    content: '这是一个用于测试缓存性能的文档',
    timestamp: Date.now(),
    data: Array(1000).fill('x').join(''), // 大文本数据测试压缩
  }
  
  const docId = await dbService.addDocument(PERFORMANCE_TEST_COLLECTION, testDoc)
  
  // 第一次读取 - 应该是缓存未命中
  console.time('首次读取')
  await dbService.getDocument(PERFORMANCE_TEST_COLLECTION, docId)
  console.timeEnd('首次读取')
  
  // 第二次读取 - 应该命中缓存
  console.time('缓存读取')
  await dbService.getDocument(PERFORMANCE_TEST_COLLECTION, docId)
  console.timeEnd('缓存读取')
  
  // 验证缓存工作
  const stats = await dbService.getPerformanceStats()
  console.log('   缓存命中率测试:', stats.cacheHitRate > 0 ? '✓ 通过' : '✗ 失败')
}

// 测试批量操作性能
async function testBatchPerformance() {
  const batchSize = 50
  const documents = []
  
  // 创建测试数据
  for (let i = 0; i < batchSize; i++) {
    documents.push({
      id: i,
      name: `批量文档 ${i}`,
      value: Math.random() * 1000,
    })
  }
  
  // 测试单个添加
  console.time('单次添加 x50')
  for (const doc of documents.slice(0, 10)) {
    await dbService.addDocument(PERFORMANCE_TEST_COLLECTION, doc, { skipBatch: true })
  }
  console.timeEnd('单次添加 x50')
  
  // 测试批量添加
  console.time('批量添加 x40')
  const batchPromises = documents.slice(10).map(doc => 
    dbService.addDocument(PERFORMANCE_TEST_COLLECTION, doc),
  )
  await Promise.all(batchPromises)
  await dbService.flushWrites()
  console.timeEnd('批量添加 x40')
}

// 测试查询性能
async function testQueryPerformance() {
  // 创建带索引的文档
  const indexedDocs = []
  for (let i = 100; i < 200; i++) {
    indexedDocs.push({
      indexKey: i,
      name: `索引文档 ${i}`,
      category: i % 3 === 0 ? 'A' : i % 3 === 1 ? 'B' : 'C',
    })
  }
  
  await Promise.all(
    indexedDocs.map(doc => dbService.addDocument(PERFORMANCE_TEST_COLLECTION, doc)),
  )
  await dbService.flushWrites()
  
  // 重建索引
  await dbService.rebuildIndexes(PERFORMANCE_TEST_COLLECTION)
  
  // 测试索引查询
  console.time('索引查询')
  const results = await dbService.queryDocuments(PERFORMANCE_TEST_COLLECTION, 'indexKey', '>', 150)
  console.timeEnd('索引查询')
  console.log('   索引查询结果数:', results.length)
  
  // 测试分类查询
  console.time('分类查询')
  const categoryResults = await dbService.queryDocuments(PERFORMANCE_TEST_COLLECTION, 'category', '==', 'B')
  console.timeEnd('分类查询')
  console.log('   分类查询结果数:', categoryResults.length)
}

// 如果直接运行此脚本（仅在Node.js环境）
if (typeof process !== 'undefined' && import.meta.url === new URL(process.argv[1], import.meta.url).href) {
  runPerformanceTests().catch(console.error)
}
